package com.hadooop.partitioner;

import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Mapper;

import java.io.IOException;

/*
处理map任务的类
Map阶段开始的时候，每一个MapTask都会逐行读取分片中的数据，并将将读取到的数据进行扭转，形成K1V1
由于我们的计算程序，是需要在不同的节点之间进行移动的，因此涉及到的K1V1、K2V2、K3V3都必须是支持序列化的类型
Hadoop提供了自己的一套序列化的机制Writable

byte     => ByteWritable
short    => ShortWritable
int      => IntWritable
long     => LongWritable
float    => FloatWritable
double   => DoubleWritable
boolean  => BooleanWritable
String   => Text

K1: 读取到的数据的行首字符的偏移量，需要设计为LongWritable
V1: 读取到的行数据，需要设计为Text

K2: 经过逻辑处理之后，需要写出的键值对中，键的类型
V2: 经过逻辑处理之后，需要写出的键值对中，值的类型
 */

public class WordCountMapper extends Mapper<LongWritable, Text, Text, IntWritable> {

    /*
    每当读取到一行的数据，将其扭转成K1和V1，调用这个方法。
    @param key 行偏移量
    @param value 行记录
    @param context 操作上下文
     */
    @Override
    protected void map(LongWritable key, Text value, Mapper<LongWritable, Text, Text, IntWritable>.Context context) throws IOException, InterruptedException {
        // 1、将读取到的每一行数据，切割出每一个单词
        String[] words = value.toString().split(" ");
        // 2、遍历每个单词
        for (String word : words) {
            // 3、为每个单词配上value，组成键值对，写出
            context.write(new Text(word), new IntWritable(1));
        }
    }
}
